#ifndef __U_SYSCALL_H_
#define __U_SYSCALL_H_

#include <common.h>

#define _NR_TaskDestory             0
#define _NR_print                   1
#define _NR_SetCursorPos            2


// 无参数的系统调用
#define _SYS_CALL0(_NR) ({          \
        U32 retval;                 \
        asm volatile(               \
            "int $0x80"             \
            : "=a" (retval)         \
            : "a" (_NR)             \
            : "memory"              \
            );                      \
        retval;                     \
})

// 一个参数的系统调用
#define _SYS_CALL1(_NR, ARG1)   ({  \
        U32 retval;                 \
        asm volatile(               \
            "int $0x80"             \
            : "=a" (retval)         \
            : "a"(_NR), "b"(ARG1)   \
            : "memory"              \
        );                          \
        retval;                     \
})

// 两个参数的系统调用
#define _SYS_CALL2(_NR, ARG1, ARG2)   ({            \
        U32 retval;                                 \
        asm volatile(                               \
            "int $0x80"                             \
            : "=a" (retval)                         \
            : "a"(_NR), "b"(ARG1), "c"(ARG2)        \
            : "memory"                              \
        );                                          \
        retval;                                     \
})

// 三个参数的系统调用
#define _SYS_CALL3(_NR, ARG1, ARG2, ARG3)   ({          \
        U32 retval;                                     \
        asm volatile(                                   \
            "int $0x80"                                 \
            : "=a" (retval)                             \
            : "a"(_NR), "b"(ARG1), "c"(ARG2), "d"(ARG3) \
            : "memory"                                  \
        );                                              \
        retval;                                         \
})

// 四个参数的系统调用
#define _SYS_CALL4(_NR, ARG1, ARG2, ARG3, ARG4)   ({                    \
        U32 retval;                                                     \
        asm volatile(                                                   \
            "int $0x80"                                                 \
            : "=a" (retval)                                             \
            : "a"(_NR), "b"(ARG1), "c"(ARG2), "d"(ARG3), "S"(ARG4)      \
            : "memory"                                                  \
        );                                                              \
        retval;                                                         \
})

// 五个参数的系统调用
#define _SYS_CALL5(_NR, ARG1, ARG2, ARG3, ARG4, ARG5)   ({                      \
        U32 retval;                                                             \
        asm volatile(                                                           \
            "int $0x80"                                                         \
            : "=a" (retval)                                                     \
            : "a"(_NR), "b"(ARG1), "c"(ARG2), "d"(ARG3), "S"(ARG4), "D"(ARG4)   \
            : "memory"                                                          \
        );                                                                      \
        retval;                                                                 \
})


/******************************************************************************
* 函数名称: void TaskDestory(void)
* 功能说明: 销毁当前任务
* 输入参数: 无
* 输出参数: 无
* 函数返回: 无
* 其它说明: 无
******************************************************************************/
E_RET TaskDestory(void);

/******************************************************************************
* 函数名称: U32 print(const char * fmt, ...)
* 功能说明: 用户打印
* 输入参数: const char * fmt    --输出格式, 目前支持的格式: 
                                        %c: 字符
                                        %s: 字符串 
                                        %x: 十六进制 
                                        %d: 十进制
    　　　　...                 --可变参数  
* 输出参数: 无
* 函数返回: 成功打印的字符个数
* 其它说明: 无
******************************************************************************/
U32 print(const char * fmt, ...);

/******************************************************************************
* 函数名称: E_RET SetCursorPos(U16 x, U16 y)
* 功能说明: 设置光标位置
* 输入参数: U16 x		--横坐标
    　　　　U16 y       --纵坐标
* 输出参数: 无
* 函数返回: E_OK:成功; E_ERR:失败
* 其它说明: 无
******************************************************************************/
E_RET SetCursorPos(U16 x, U16 y);


#endif
